今天做的是:
題目只給一個 drawing.flag.svg,flag 被藏在檔案裡但看起來是看不見的。
SVG 是 XML(純文字),作者把 flag 放在 / 裡,但把字體設極小且填色為白色,所以在圖上看不見;直接把 SVG 當文字檔檢視、抽出 內容並把字元拼接起來就能得到 flag。
解題步驟
一、下載檔案:
wget -O drawing.flag.svg https://artifacts.picoctf.net/c/102/drawing.flag.svg
二、快速查看檔頭(確認是 SVG / Inkscape):
head -n 40 drawing.flag.svg
可以看到 XML header 與 ,表示是由 Inkscape 產生的標準 SVG。
三、定位含文字的區段(我用 sed 看第 40–120 行):
sed -n '40,120p' drawing.flag.svg
會看到 <text ...> 裡面有很多 ,每個 裡包含一個或幾個字元:
<tspan ...>p </tspan><tspan ...>i </tspan><tspan ...>c </tspan> ...
<tspan ...>F { 3 n h 4 n </tspan><tspan ...>c 3 d _ d 0 a 7 5 7 b f }</tspan>
注意:style 裡有 font-size:0.00352781px; fill:#ffffff; —— 字型超小且是白色(背景也是白色) → 文字在畫面上不可見。
四、因為 被拆成很多片段(逐字或逐小塊),直接 grep "picoCTF{" 可能找不到整段。於是我把所有 的內文抽出再拼接:
grep -oP '(?<=<tspan[^>]>).?(?=)' drawing.flag.svg | tr -d ' \n'
系統輸出:picoCTF{3nh4nc3d_d0a757bf}
原理說明
SVG = XML = 純文字檔:任何用向量繪圖工具(Inkscape、Illustrator)輸出的 SVG 都是可讀的 XML,裡面包含 、、、、 等節點。
作者用 CSS 屬性把文字「變得不可見」——像把 fill:#ffffff(白色)套到白背景、或把 font-size 設到非常小,讓人在視覺上看不到,但文字內容仍在檔案內。
為了避免直接用 grep "picoCTF{" 找到,字可能被拆成多個 甚至一個字一個 ;所以需要把所有 內容抽出並合併。
小小心得
這題對我來說是很新鮮的體驗,因為之前接觸的 CTF 解題大多是在程式碼、加密、hash 或 web 服務上動腦,這次卻是遇到一個 SVG 向量圖檔。
剛開始會以為「圖片」應該要用圖像處理的角度來做,但其實 SVG 是純文字的 XML 格式,等於是可以直接打開來讀,就像閱讀 HTML 或程式一樣。